#include "binadd.h"
//#include <conio.h>
//#define I (unsigned long)1

class CPermutation {
private :
	int temp ;
public :
	int n ;
	int tr[2] ;
	struct t_prmut {
		int* s ;
		long* flag ;
	} ;
	int pos, pos1 ;
	t_prmut dat ;

	void print() {
		for (int i=0; i<n; i++)
		cout << dat.s[n-i-1] ;
		cout << endl ;
	}

	int next() {
		pos1=0 ;
		while( dat.flag[pos] & ( I << dat.s[pos1] )) pos1++ ;
		if ( pos1 < pos ) {
			dat.flag[pos] |= ( I << dat.s[pos1] ) ;
			dat.flag[pos1] = I<<dat.s[pos] ;
			tr[0] = pos1 ;
			tr[1] = pos ;
			transp() ;
			pos = 0 ;
			return 0 ;
		}
		else    if ( pos < n-1 ) {
						dat.flag[pos] = I<<dat.s[pos] ;
						pos++ ;
						return next() ;
					}
		else return 1 ;
	}

	inline void transp(){
		temp = dat.s[pos1] ;
		dat.s[pos1] = dat.s[pos] ;
		dat.s[pos] = temp ;
	}

	int col_swap( CBinCode& C ) {
		// if( !next() ) {
			for( int i=0; i<C.k; i++ )
				C.row[i].bit_swap ( tr[0], tr[1] ) ;
			return 0 ;
		// }
		// else return 1 ;
	}

	int swap(CBinWord& bw) {
		temp = 0 ;
		for ( int i=0; i<bw.n; i++ ) {
			if( (I<<i) & bw.num ) {
				temp^=(I<<dat.s[i]) ;
			}
		}
		bw.num = temp ;
		return 0 ;
	}

	int swap (CBinCode& C) {
		for ( int i=0; i<C.k; i++ ) {
			swap(C.row[i]) ;
		}
		return 0;
	}

	CPermutation(int n):n(n){
		dat.s = new(int[n]) ;
		dat.flag = new(long[n]) ;
		pos = pos1 = 0 ;
		for ( int i=0; i<n; i++ ) {
			dat.s[i]=i ;
			dat.flag[i]=I<<i ;
		}
	}
} ;

/*
int main () {

CPermutation a(3) ;
int iend ;
CBinCode C(1, 3) ;
cin >> C ;

while( ! a.next() ) {
	cout << C ;
	a.swap(C.row[0]) ;
	gotoxy(10, wherey()-1) ;
	a.print() ;
} ;

return 0;
}
	*/
